using System;
using System.Collections.Generic;
using BancoX.Dominio;

namespace BancoX.Persistencia
{
    public class RepositorioCuentas : IRepositorioCuentas
    {
        private List<CuentaBancaria> _cuentas;
        private IRepositorioClientes _repositorioClientes;

        public IRepositorioClientes RepositorioClientes
        {
            set 
            {
                _repositorioClientes = value;
                Inicializar();
            } 
        }

        public RepositorioCuentas()
        {}


        protected void Inicializar()
        {
            _cuentas = new List<CuentaBancaria>();

            IList<Cliente> _clientes = _repositorioClientes.ObtenerTodos();
            foreach (Cliente cliente in _clientes)
            {
                CuentaBancaria cuenta1 = new CajaDeAhorro(cliente, "CA" + GeneradorDeIdentificadores.GetNumeroDeCuenta());
                cuenta1.Acreditar(100);

                CuentaBancaria cuenta2 = new CuentaCorriente(cliente, "CC" + GeneradorDeIdentificadores.GetNumeroDeCuenta());
                cuenta2.Acreditar(200);
                
                _cuentas.Add(cuenta1);
                _cuentas.Add(cuenta2);

                cliente.Cuentas.Add(cuenta1);
                cliente.Cuentas.Add(cuenta2);
            }
        }

        #region IRepositorioCuentas Members

        public CuentaBancaria ObtenerCuenta(string numeroCuenta)
        {
            foreach (CuentaBancaria cuenta in _cuentas)
            {
                if (cuenta.Numero.Equals(numeroCuenta))
                    return cuenta;
            }
            return null;
        }

        public IList<CuentaBancaria> ObtenerCuentasPorCliente(Cliente cliente)
        {
            List<CuentaBancaria> resultado = new List<CuentaBancaria>();
            foreach (CuentaBancaria cuenta in _cuentas)
            {
                if (cuenta.Titular.Dni.Equals(cliente.Dni))
                    resultado.Add(cuenta);
            }
            return resultado;
        }

        public IList<CuentaBancaria> ObtenerCuentasPorCliente(string dni)
        {
            List<CuentaBancaria> resultado = new List<CuentaBancaria>();
            foreach (CuentaBancaria cuenta in _cuentas)
            {
                if (cuenta.Titular.Dni.Equals(dni))
                    resultado.Add(cuenta);
            }
            return resultado;
        }

        public void Guardar(CuentaBancaria cuenta)
        { 
            
        }

        #endregion
    }
}
